﻿using Com.Alipay;
using SQLServer.DBUtility;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Tenancy.Helper;


// <summary>
/// 功能：服务器异步通知页面
/// 版本：3.3
/// 日期：2012-07-10
/// 说明：
/// 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
/// ///////////////////页面功能说明///////////////////
/// 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
/// 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
/// 该页面调试工具请使用写文本函数logResult。
/// 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
/// </summary>
namespace Tenancy.PayZFB
{
    public partial class notify_url : System.Web.UI.Page
    {
      
        protected void Page_Load(object sender, EventArgs e)
        {
            //创建路径
            string logpath = "../files/";
            logpath = Server.MapPath(logpath);
            // 文件存取路径不存在则创建
            if (!Directory.Exists(logpath))
            {
                System.IO.Directory.CreateDirectory(logpath);
            }
            //创建文件
            string logTxt = "../files/notifylog.txt";
            logTxt = Server.MapPath(logTxt);
          
            if (!File.Exists(logTxt))
            {
                FileStream fs = File.Create(logTxt);
                fs.Close();
            }
            List<string> liInfo = new List<string>();
          
            string strA = DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss]") + " 充值接口start……";
            liInfo.Add(strA);
            System.IO.File.AppendAllLines(logTxt, liInfo);
            SortedDictionary<string, string> sPara = GetRequestPost();

            if (sPara.Count > 0)//判断是否有带返回参数
            {
                Notify aliNotify = new Notify();
               // System.IO.File.WriteAllText("D:\\log99.txt", "Fucu you!");
                bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);

                if (verifyResult)//验证成功
                {
                    //请在这里加上商户的业务逻辑程序代码
                    strA = DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss]") + " 充值接口验证成功";
                    liInfo.Add(strA);
                   
                    //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

                    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
                    //商户订单号
                    string out_trade_no = Request.Form["out_trade_no"];
                    //支付宝交易号
                    string trade_no = Request.Form["trade_no"];
                    //交易状态
                    string trade_status = Request.Form["trade_status"];
                    // 购买人支付宝账号
                    string buyer_id = Request.Form["buyer_id"];
                    //交易金额
                    string total_fee = Request.Form["total_fee"];

                    if (Request.Form["trade_status"] == "TRADE_FINISHED")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                        //如果有做过处理，不执行商户的业务程序

                        //注意：
                        //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知

                    }
                    else if (Request.Form["trade_status"] == "TRADE_SUCCESS")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                        //如果有做过处理，不执行商户的业务程序

                        //注意：
                        //付款完成后，支付宝系统发送该交易状态通知

                        #region 支付情况查询
                        string ComStr = string.Format(@"select * from Hbung_RechargeRecords c 
                                 left join (select * from dbo.Hbung_CompanyInfo ) b 
                                 on b.ID =c.rUserID 
                                 where c.tGuID='{0}'", out_trade_no);
                        DataTable OrderRecords = DBHelpSQL.Query(ComStr).Tables[0];
                        #endregion

                        #region 处理订单交易记录表
                        if (OrderRecords != null && OrderRecords.Rows.Count > 0)
                        {
                            DataRow drCharge = OrderRecords.Rows[0];
                            //判断该笔订单是否在商户网站中已经做过处理
                            string strStatus = drCharge["rStatus"].ToString();
                            if (strStatus.Equals("0"))
                            {
                                List<string> liExcutes = new List<string>();
                                string LSHXSTr = string.Format(@"update Hbung_RechargeRecords set rTradeNum='{0}',rPayType='支付宝',rStatus='1',
                                 rBuyer_IDD='{1}',rTime=getdate() where tGuID='{2}'
                                    ", trade_no, buyer_id, out_trade_no);
                                liExcutes.Add(LSHXSTr);
                                     LSHXSTr = string.Format(@"update OnlineOrders set OrderStatus='1' where OrderNum='{0}' and CPhone='{1}' ",
                                    OrderRecords.Rows[0]["rOrderNum"].ToString(), OrderRecords.Rows[0]["rUserTel"].ToString());
                                     liExcutes.Add(LSHXSTr);
                               if (DBHelpSQL.ExecuteSqlTran(liExcutes)>0)
                                {
                                    //给老用户给 业务员 ，行政，经理推送,新用户给区域经理推送
                                    string OrderStr = string.Format("select CPhone,MachineUseAddress,SLinkPhone,PeoType,SalemanTel,PEquipmentType,RentStartDate,RentEndDate from OnlineOrders where OrderNum='{0}' and CPhone='{1}' ", drCharge["rOrderNum"].ToString(), drCharge["rUserTel"].ToString());
                                    DataTable SXMDate = DbLocalSQL.Query(OrderStr).Tables[0];
                                    if (SXMDate != null && SXMDate.Rows.Count > 0)
                                    {
                                        string ComPanyName = string.Empty;
                                        string ComInfo = string.Format("select CompanyName from Hbung_CompanyInfo where CellTel='{0}'", SXMDate.Rows[0]["CPhone"].ToString());
                                        DataTable comdata = DBHelpSQL.Query(ComInfo).Tables[0];
                                        if (comdata != null && comdata.Rows.Count > 0)
                                        {
                                            if (!string.IsNullOrEmpty(comdata.Rows[0]["CompanyName"].ToString()))
                                            {
                                                if (comdata.Rows[0]["CompanyName"].ToString().Length > 10)
                                                {
                                                    ComPanyName = comdata.Rows[0]["CompanyName"].ToString().Substring(0, 9);
                                                }
                                            }
                                        }
                                        if (SXMDate.Rows[0]["PeoType"].ToString() == "业务员")
                                        {
                                            //业务员推送消息
                                            if (!string.IsNullOrEmpty(SXMDate.Rows[0]["SalemanTel"].ToString()))
                                            {
                                                Tenancy.Helper.MsgSend.HB_SendMsg(SXMDate.Rows[0]["SalemanTel"].ToString(), GenerClass.MouldSMS(ComPanyName, SXMDate.Rows[0]["SLinkPhone"].ToString(), SXMDate.Rows[0]["PEquipmentType"].ToString(), Convert.ToDateTime(SXMDate.Rows[0]["RentStartDate"].ToString()).ToString("yy/MM/dd"), Convert.ToDateTime(SXMDate.Rows[0]["RentEndDate"].ToString()).ToString("yy/MM/dd"), SXMDate.Rows[0]["MachineUseAddress"].ToString()));
                                                string OldStr = string.Format("select * from SalesAdminManger where SalesTel='{0}'", SXMDate.Rows[0]["SalemanTel"].ToString());
                                                DataTable OldData = DbLocalSQL.Query(OldStr).Tables[0];
                                                if (OldData != null && OldData.Rows.Count > 0)
                                                {
                                                    //行政推送消息
                                                    if (!string.IsNullOrEmpty(OldData.Rows[0]["AdminTel"].ToString()))
                                                    {
                                                        Tenancy.Helper.MsgSend.HB_SendMsg(SXMDate.Rows[0]["SalemanTel"].ToString(), GenerClass.MouldSMS(ComPanyName, SXMDate.Rows[0]["SLinkPhone"].ToString(), SXMDate.Rows[0]["PEquipmentType"].ToString(), Convert.ToDateTime(SXMDate.Rows[0]["RentStartDate"].ToString()).ToString("yy/MM/dd"), Convert.ToDateTime(SXMDate.Rows[0]["RentEndDate"].ToString()).ToString("yy/MM/dd"), SXMDate.Rows[0]["MachineUseAddress"].ToString()));
                                                    }

                                                    //区域经理推送消息
                                                    if (!string.IsNullOrEmpty(OldData.Rows[0]["ManagerTel"].ToString()))
                                                    {
                                                        Tenancy.Helper.MsgSend.HB_SendMsg(SXMDate.Rows[0]["SalemanTel"].ToString(), GenerClass.MouldSMS(ComPanyName, SXMDate.Rows[0]["SLinkPhone"].ToString(), SXMDate.Rows[0]["PEquipmentType"].ToString(), Convert.ToDateTime(SXMDate.Rows[0]["RentStartDate"].ToString()).ToString("yy/MM/dd"), Convert.ToDateTime(SXMDate.Rows[0]["RentEndDate"].ToString()).ToString("yy/MM/dd"), SXMDate.Rows[0]["MachineUseAddress"].ToString()));
                                                    }
                                                }
                                            }
                                        }

                                        if (SXMDate.Rows[0]["PeoType"].ToString() == "区域经理")
                                        {
                                            Tenancy.Helper.MsgSend.HB_SendMsg(SXMDate.Rows[0]["SalemanTel"].ToString(), GenerClass.MouldSMS(ComPanyName, SXMDate.Rows[0]["SLinkPhone"].ToString(), SXMDate.Rows[0]["PEquipmentType"].ToString(), Convert.ToDateTime(SXMDate.Rows[0]["RentStartDate"].ToString()).ToString("yy/MM/dd"), Convert.ToDateTime(SXMDate.Rows[0]["RentEndDate"].ToString()).ToString("yy/MM/dd"), SXMDate.Rows[0]["MachineUseAddress"].ToString()));
                                        }

                                    }
                                }
                              
                            }
                        }
                        #endregion



                        strA = DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss]") + " 充值接口TRADE_SUCCESS";
                        liInfo.Add(strA);


                    }
                    else
                    {
                        strA = DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss]") + " 充值接口default";
                        liInfo.Add(strA);
                    }


                    //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

                    Response.Write("success");  //请不要修改或删除

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    strA = DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss]") + " 充值接口验证失败";
                    liInfo.Add(strA);
                    Response.Write("fail");
                }
            }
            else
            {
                strA = DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss]") + " 充值接口无通知参数";
                liInfo.Add(strA);
                Response.Write("无通知参数");
            }
            System.IO.File.AppendAllLines(logTxt, liInfo);
        }

        /// <summary>
        /// 获取支付宝POST过来通知消息，并以“参数名=参数值”的形式组成数组
        /// </summary>
        /// <returns>request回来的信息组成的数组</returns>
        public SortedDictionary<string, string> GetRequestPost()
        {
            int i = 0;
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.Form;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
            }

            return sArray;
        }
    }
}